package com.headfirst.CreateMode.factory.factorymethod;

import com.headfirst.CreateMode.factory.factorymethod.myEnums.PizzaType;

import java.util.Objects;

/**
 * 订购Pizza的商店
 * @author sunhongguang
 * @create 2022-01-23-21:29
 */
public abstract class PizzaStore {

    /**
     * 披萨商店里面的订购披萨的方法，根据传入的披萨类型，得到此类型的披萨
     * 
     * 工厂方法（createPizza方法）用来处理对象的创建，并将这样的行为封装在子类中。
     * 这样，客户程序中关于超类的代码就和子类对象创建代码解耦了。
     * @param type 披萨类型
     * @return 指定类型的披萨
     */
    public final Pizza orderPizza(String type){
        Pizza pizza;
        if(isLegal(type)){
            pizza = createPizza(type);
        }else {
            pizza = this.createOriginalFlavorPizza();
        }
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }

    protected boolean isLegal(String type){
        if(type == null){
            return false;
        }
        for(PizzaType pizzaType : PizzaType.values()){
            if(Objects.equals(pizzaType.getDesc(), type)){
                return true;
            }
        }
        return false;
    }

    /**
     * 抽象的工厂方法，由具体的子类去实现
     * @param type 披萨类型
     * @return 指定类型的披萨
     */
    protected abstract Pizza createPizza(String type);

    /**
     * 默认的工厂方法生产原味披萨，当PizzaStore没有任何子类时，依然可以创建产品
     * （即：当创建者没有任何子类时，依然可以创建默认的披萨，此处创建的是原味披萨）
     * @return 原味披萨
     */
    public Pizza createOriginalFlavorPizza(){
        return new OriginalFlavorPizza();
    }
}
